package com.core.cloudcommon;

import java.util.Random;

/**
 * @author =====Lqj=====
 * @className CommonRandomExample
 * @description 获取随机数
 * @create 2024/12/4 20:52
 **/

public class CommonRandomExample {

    public static Integer appoint(Integer min, Integer max) {
        // 生成 [min, max] 范围内的随机整数
        return (int) (Math.random() * (max - min + 1)) + min;
    }


    /**
     * 随机身份证号码的生成
     */

    public static String generateIDCard() {
        Random random = new Random();

        // 1. 生成地址码（前6位），我们可以模拟一个随机的地址码，实际可以根据真实的地区编码来生成
        String addressCode = String.format("%06d", random.nextInt(999999));

        // 2. 生成出生日期（8位：YYYYMMDD）
        String birthDate = generateRandomBirthDate();

        // 3. 生成顺序码（3位）
        String sequenceCode = String.format("%03d", random.nextInt(1000));

        // 4. 性别：根据顺序码的最后一位，奇数为男性，偶数为女性
        // 这里我们使用随机生成的顺序码，并根据奇偶判断性别
        int genderFlag = Integer.parseInt(sequenceCode.substring(2, 3));

        // 5. 计算校验码（第18位）
        String idWithoutCheck = addressCode + birthDate + sequenceCode;
        char checkCode = calculateCheckCode(idWithoutCheck);

        // 拼接完整的身份证号
        return idWithoutCheck + checkCode;
    }

    /**
     * 随机生成车牌号
     *
     * @return
     */
    public static String generateLicensePlate() {
        Random random = new Random();

        // 1. 随机选择一个省份
        String province = "粤";

        // 2. 随机生成一个字母作为城市代码
        char cityCode = (char) ('A' + random.nextInt(26));

        // 3. 生成一个随机数字（5位）并添加 "·"
        StringBuilder numberPart = new StringBuilder();
        for (int i = 0; i < 5; i++) {
            int choice = random.nextInt(2); // 0: 数字, 1: 字母
            if (choice == 0) {
                // 生成数字
                numberPart.append(random.nextInt(10));
            } else {
                // 生成字母
                numberPart.append((char) ('A' + random.nextInt(26)));
            }
        }

        // 4. 拼接并返回车牌号，字母与数字之间有 "·" 分隔
        return province + cityCode + "·" + numberPart.toString();
    }

    // 随机生成出生日期（yyyyMMdd）
    private static String generateRandomBirthDate() {
        Random random = new Random();
        int year = random.nextInt(100) + 1920; // 假设出生年从1920年到2023年
        int month = random.nextInt(12) + 1; // 1到12月
        int day = random.nextInt(28) + 1; // 1到28日，避免不合法日期
        return String.format("%04d%02d%02d", year, month, day);
    }

    // 根据身份证前17位计算校验码
    private static char calculateCheckCode(String id) {
        // 校验码的加权因子
        int[] weight = {7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2};
        // 校验码对应表
        char[] checkCodeTable = {'1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'};

        int sum = 0;
        for (int i = 0; i < 17; i++) {
            sum += Character.getNumericValue(id.charAt(i)) * weight[i];
        }

        int remainder = sum % 11;
        return checkCodeTable[remainder];
    }
}
